long do_dom0_op(dom0_op_t *u_dom0_op)
{
long ret = 0;
- dom0_op_t curop,*op=&curop;
+ dom0_op_t curop, *op = &curop;
if ( !IS_PRIV(current) )
return -EPERM;
case DOM0_BUILDDOMAIN:
{
- struct domain * p = find_domain_by_id(op->u.builddomain.domain);
+ struct domain *d = find_domain_by_id(op->u.builddomain.domain);
ret = -EINVAL;
- if ( p != NULL )
+ if ( d != NULL )
{
- ret = final_setup_guestos(p, &op->u.builddomain);
- put_domain(p);
+ ret = final_setup_guestos(d, &op->u.builddomain);
+ put_domain(d);
}
}
break;
case DOM0_CREATEDOMAIN:
{
- struct domain *p;
+ struct domain *d;
static domid_t domnr = 0;
static spinlock_t domnr_lock = SPIN_LOCK_UNLOCKED;
- unsigned int pro;
- domid_t dom;
+ unsigned int pro;
+ domid_t dom;
+
ret = -ENOMEM;
/* Search for an unused domain identifier. */
dom = domnr = 1;
spin_unlock(&domnr_lock);
- if ( (p = find_domain_by_id(dom)) == NULL )
+ if ( (d = find_domain_by_id(dom)) == NULL )
break;
- put_domain(p);
+ put_domain(d);
}
- if (op->u.createdomain.cpu == -1 )
+ if ( op->u.createdomain.cpu == -1 )
pro = (unsigned int)dom % smp_num_cpus;
else
pro = op->u.createdomain.cpu % smp_num_cpus;
- p = do_createdomain(dom, pro);
- if ( p == NULL )
+ d = do_createdomain(dom, pro);
+ if ( d == NULL )
break;
if ( op->u.createdomain.name[0] )
{
- strncpy(p->name, op->u.createdomain.name, MAX_DOMAIN_NAME);
- p->name[MAX_DOMAIN_NAME - 1] = '\0';
+ strncpy(d->name, op->u.createdomain.name, MAX_DOMAIN_NAME);
+ d->name[MAX_DOMAIN_NAME - 1] = '\0';
}
- ret = alloc_new_dom_mem(p, op->u.createdomain.memory_kb);
+ ret = alloc_new_dom_mem(d, op->u.createdomain.memory_kb);
if ( ret != 0 )
{
- domain_kill(p);
+ domain_kill(d);
break;
}
ret = 0;
- op->u.createdomain.domain = p->domain;
+ op->u.createdomain.domain = d->domain;
copy_to_user(u_dom0_op, op, sizeof(*op));
}
break;
ret = -EINVAL;
else
{
- struct domain * p = find_domain_by_id(dom);
+ struct domain *d = find_domain_by_id(dom);
int cpu = op->u.pincpudomain.cpu;
ret = -ESRCH;
- if ( p != NULL )
+ if ( d != NULL )
{
if ( cpu == -1 )
{
- clear_bit(DF_CPUPINNED, &p->flags);
+ clear_bit(DF_CPUPINNED, &d->flags);
}
else
{
- domain_pause(p);
- set_bit(DF_CPUPINNED, &p->flags);
+ domain_pause(d);
+ set_bit(DF_CPUPINNED, &d->flags);
cpu = cpu % smp_num_cpus;
- p->processor = cpu;
- domain_unpause(p);
+ d->processor = cpu;
+ domain_unpause(d);
}
- put_domain(p);
+ put_domain(d);
ret = 0;
}
}
case DOM0_GETMEMLIST:
{
int i;
- struct domain *p = find_domain_by_id(op->u.getmemlist.domain);
+ struct domain *d = find_domain_by_id(op->u.getmemlist.domain);
unsigned long max_pfns = op->u.getmemlist.max_pfns;
unsigned long pfn;
unsigned long *buffer = op->u.getmemlist.buffer;
struct list_head *list_ent;
ret = -EINVAL;
- if ( p != NULL )
+ if ( d != NULL )
{
ret = 0;
- spin_lock(&p->page_list_lock);
- list_ent = p->page_list.next;
- for ( i = 0; (i < max_pfns) && (list_ent != &p->page_list); i++ )
+ spin_lock(&d->page_list_lock);
+ list_ent = d->page_list.next;
+ for ( i = 0; (i < max_pfns) && (list_ent != &d->page_list); i++ )
{
pfn = list_entry(list_ent, struct pfn_info, list) -
frame_table;
buffer++;
list_ent = frame_table[pfn].list.next;
}
- spin_unlock(&p->page_list_lock);
+ spin_unlock(&d->page_list_lock);
op->u.getmemlist.num_pfns = i;
copy_to_user(u_dom0_op, op, sizeof(*op));
- put_domain(p);
+ put_domain(d);
}
}
break;
case DOM0_GETDOMAININFO:
{
full_execution_context_t *c;
- struct domain *p;
+ struct domain *d;
unsigned long flags;
- int i, dump_state = 0;
+ int i;
read_lock_irqsave(&tasklist_lock, flags);
- for_each_domain ( p )
+ for_each_domain ( d )
{
- if ( p->domain >= op->u.getdomaininfo.domain )
+ if ( d->domain >= op->u.getdomaininfo.domain )
break;
}
- if ( p == NULL )
+ if ( (d == NULL) || !get_domain(d) )
{
+ read_unlock_irqrestore(&tasklist_lock, flags);
ret = -ESRCH;
- goto gdi_out;
+ break;
}
- else
- {
- op->u.getdomaininfo.domain = p->domain;
- strcpy(op->u.getdomaininfo.name, p->name);
-
- /* These are kind of in order of 'importance'. */
- if ( test_bit(DF_CRASHED, &p->flags) )
- op->u.getdomaininfo.flags = DOMSTATE_CRASHED;
- else if ( test_bit(DF_SUSPENDED, &p->flags) )
- op->u.getdomaininfo.flags = DOMSTATE_SUSPENDED;
- else if ( test_bit(DF_STOPPED, &p->flags) )
- op->u.getdomaininfo.flags = DOMSTATE_PAUSED;
- else if ( test_bit(DF_BLOCKED, &p->flags) )
- op->u.getdomaininfo.flags = DOMSTATE_BLOCKED;
- else if ( test_bit(DF_RUNNING, &p->flags) )
- {
- op->u.getdomaininfo.flags = DOMSTATE_RUNNING;
- dump_state = 1;
- }
- else
- {
- op->u.getdomaininfo.flags = DOMSTATE_RUNNABLE;
- dump_state = 1;
- }
- op->u.getdomaininfo.flags |= p->processor << DOMFLAGS_CPUSHIFT;
- op->u.getdomaininfo.flags |= p->stop_code << DOMFLAGS_GUESTSHIFT;
+ op->u.getdomaininfo.flags =
+ (test_bit(DF_RUNNING, &d->flags) ? DOMFLAGS_RUNNING : 0);
- op->u.getdomaininfo.tot_pages = p->tot_pages;
- op->u.getdomaininfo.max_pages = p->max_pages;
- op->u.getdomaininfo.cpu_time = p->cpu_time;
- op->u.getdomaininfo.shared_info_frame =
- __pa(p->shared_info) >> PAGE_SHIFT;
+ domain_pause(d);
- if ( dump_state && (op->u.getdomaininfo.ctxt != NULL) )
+ op->u.getdomaininfo.domain = d->domain;
+ strcpy(op->u.getdomaininfo.name, d->name);
+
+ op->u.getdomaininfo.flags |=
+ (test_bit(DF_DYING, &d->flags) ? DOMFLAGS_DYING : 0) |
+ (test_bit(DF_CRASHED, &d->flags) ? DOMFLAGS_CRASHED : 0) |
+ (test_bit(DF_SUSPENDED, &d->flags) ? DOMFLAGS_SUSPENDED : 0) |
+ (test_bit(DF_STOPPED, &d->flags) ? DOMFLAGS_STOPPED : 0) |
+ (test_bit(DF_BLOCKED, &d->flags) ? DOMFLAGS_BLOCKED : 0);
+
+ op->u.getdomaininfo.flags |= d->processor << DOMFLAGS_CPUSHIFT;
+ op->u.getdomaininfo.flags |=
+ d->suspend_code << DOMFLAGS_SUSPCODESHIFT;
+
+ op->u.getdomaininfo.tot_pages = d->tot_pages;
+ op->u.getdomaininfo.max_pages = d->max_pages;
+ op->u.getdomaininfo.cpu_time = d->cpu_time;
+ op->u.getdomaininfo.shared_info_frame =
+ __pa(d->shared_info) >> PAGE_SHIFT;
+
+ if ( op->u.getdomaininfo.ctxt != NULL )
+ {
+ if ( (c = kmalloc(sizeof(*c), GFP_KERNEL)) == NULL )
{
- if ( (c = kmalloc(sizeof(*c), GFP_KERNEL)) == NULL )
- {
- ret = -ENOMEM;
- goto gdi_out;
- }
+ ret = -ENOMEM;
+ goto gdi_out;
+ }
- rmb(); /* Ensure that we see saved register state. */
- c->flags = 0;
- memcpy(&c->cpu_ctxt,
- &p->shared_info->execution_context,
- sizeof(p->shared_info->execution_context));
- if ( test_bit(DF_DONEFPUINIT, &p->flags) )
- c->flags |= ECF_I387_VALID;
- memcpy(&c->fpu_ctxt,
- &p->thread.i387,
- sizeof(p->thread.i387));
- memcpy(&c->trap_ctxt,
- p->thread.traps,
- sizeof(p->thread.traps));
+ c->flags = 0;
+ memcpy(&c->cpu_ctxt,
+ &d->shared_info->execution_context,
+ sizeof(d->shared_info->execution_context));
+ if ( test_bit(DF_DONEFPUINIT, &d->flags) )
+ c->flags |= ECF_I387_VALID;
+ memcpy(&c->fpu_ctxt,
+ &d->thread.i387,
+ sizeof(d->thread.i387));
+ memcpy(&c->trap_ctxt,
+ d->thread.traps,
+ sizeof(d->thread.traps));
#ifdef ARCH_HAS_FAST_TRAP
- if ( (p->thread.fast_trap_desc.a == 0) &&
- (p->thread.fast_trap_desc.b == 0) )
- c->fast_trap_idx = 0;
- else
- c->fast_trap_idx =
- p->thread.fast_trap_idx;
+ if ( (d->thread.fast_trap_desc.a == 0) &&
+ (d->thread.fast_trap_desc.b == 0) )
+ c->fast_trap_idx = 0;
+ else
+ c->fast_trap_idx =
+ d->thread.fast_trap_idx;
#endif
- c->ldt_base = p->mm.ldt_base;
- c->ldt_ents = p->mm.ldt_ents;
- c->gdt_ents = 0;
- if ( GET_GDT_ADDRESS(p) == GDT_VIRT_START )
- {
- for ( i = 0; i < 16; i++ )
- c->gdt_frames[i] =
- l1_pgentry_to_pagenr(p->mm.perdomain_pt[i]);
- c->gdt_ents =
- (GET_GDT_ENTRIES(p) + 1) >> 3;
- }
- c->guestos_ss = p->thread.guestos_ss;
- c->guestos_esp = p->thread.guestos_sp;
- c->pt_base =
- pagetable_val(p->mm.pagetable);
- memcpy(c->debugreg,
- p->thread.debugreg,
- sizeof(p->thread.debugreg));
- c->event_callback_cs =
- p->event_selector;
- c->event_callback_eip =
- p->event_address;
- c->failsafe_callback_cs =
- p->failsafe_selector;
- c->failsafe_callback_eip =
- p->failsafe_address;
-
- if ( copy_to_user(op->u.getdomaininfo.ctxt, c, sizeof(*c)) )
- ret = -EINVAL;
-
- if ( c != NULL )
- kfree(c);
+ c->ldt_base = d->mm.ldt_base;
+ c->ldt_ents = d->mm.ldt_ents;
+ c->gdt_ents = 0;
+ if ( GET_GDT_ADDRESS(d) == GDT_VIRT_START )
+ {
+ for ( i = 0; i < 16; i++ )
+ c->gdt_frames[i] =
+ l1_pgentry_to_pagenr(d->mm.perdomain_pt[i]);
+ c->gdt_ents =
+ (GET_GDT_ENTRIES(d) + 1) >> 3;
}
+ c->guestos_ss = d->thread.guestos_ss;
+ c->guestos_esp = d->thread.guestos_sp;
+ c->pt_base =
+ pagetable_val(d->mm.pagetable);
+ memcpy(c->debugreg,
+ d->thread.debugreg,
+ sizeof(d->thread.debugreg));
+ c->event_callback_cs =
+ d->event_selector;
+ c->event_callback_eip =
+ d->event_address;
+ c->failsafe_callback_cs =
+ d->failsafe_selector;
+ c->failsafe_callback_eip =
+ d->failsafe_address;
+
+ if ( copy_to_user(op->u.getdomaininfo.ctxt, c, sizeof(*c)) )
+ ret = -EINVAL;
+
+ if ( c != NULL )
+ kfree(c);
}
if ( copy_to_user(u_dom0_op, op, sizeof(*op)) )
ret = -EINVAL;
gdi_out:
- read_unlock_irqrestore(&tasklist_lock, flags);
+ domain_unpause(d);
+ put_domain(d);
}
break;
struct pfn_info *page;
unsigned long pfn = op->u.getpageframeinfo.pfn;
domid_t dom = op->u.getpageframeinfo.domain;
- struct domain *p;
+ struct domain *d;
ret = -EINVAL;
if ( unlikely(pfn >= max_page) ||
- unlikely((p = find_domain_by_id(dom)) == NULL) )
+ unlikely((d = find_domain_by_id(dom)) == NULL) )
break;
page = &frame_table[pfn];
- if ( likely(get_page(page, p)) )
+ if ( likely(get_page(page, d)) )
{
ret = 0;
put_page(page);
}
- put_domain(p);
+ put_domain(d);
copy_to_user(u_dom0_op, op, sizeof(*op));
}
case DOM0_SHADOW_CONTROL:
{
- struct domain *p;
+ struct domain *d;
ret = -ESRCH;
- p = find_domain_by_id( op->u.shadow_control.domain );
- if ( p )
+ d = find_domain_by_id(op->u.shadow_control.domain);
+ if ( d != NULL )
{
- ret = shadow_mode_control(p, &op->u.shadow_control );
- put_domain(p);
+ ret = shadow_mode_control(d, &op->u.shadow_control);
+ put_domain(d);
copy_to_user(u_dom0_op, op, sizeof(*op));
}
}
case DOM0_SCHED_ID:
{
op->u.sched_id.sched_id = sched_id();
-
copy_to_user(u_dom0_op, op, sizeof(*op));
ret = 0;
}
case DOM0_SETDOMAINNAME:
{
- struct domain *p;
- p = find_domain_by_id( op->u.setdomainname.domain );
- if ( p )
+ struct domain *d;
+ ret = -ESRCH;
+ d = find_domain_by_id( op->u.setdomainname.domain );
+ if ( d != NULL )
{
- strncpy(p->name, op->u.setdomainname.name, MAX_DOMAIN_NAME);
- put_domain(p);
+ strncpy(d->name, op->u.setdomainname.name, MAX_DOMAIN_NAME);
+ put_domain(d);
+ ret = 0;
}
- else
- ret = -ESRCH;
}
break;
case DOM0_SETDOMAININITIALMEM:
{
- struct domain *p;
+ struct domain *d;
ret = -ESRCH;
- p = find_domain_by_id( op->u.setdomaininitialmem.domain );
- if ( p )
+ d = find_domain_by_id(op->u.setdomaininitialmem.domain);
+ if ( d != NULL )
{
/* should only be used *before* domain is built. */
- if ( ! test_bit(DF_CONSTRUCTED, &p->flags) )
+ if ( !test_bit(DF_CONSTRUCTED, &d->flags) )
ret = alloc_new_dom_mem(
- p, op->u.setdomaininitialmem.initial_memkb );
+ d, op->u.setdomaininitialmem.initial_memkb );
else
ret = -EINVAL;
- put_domain(p);
+ put_domain(d);
}
}
break;
case DOM0_SETDOMAINMAXMEM:
{
- struct domain *p;
- p = find_domain_by_id( op->u.setdomainmaxmem.domain );
- if ( p )
+ struct domain *d;
+ ret = -ESRCH;
+ d = find_domain_by_id( op->u.setdomainmaxmem.domain );
+ if ( d != NULL )
{
- p->max_pages =
+ d->max_pages =
(op->u.setdomainmaxmem.max_memkb+PAGE_SIZE-1)>> PAGE_SHIFT;
- put_domain(p);
+ put_domain(d);
+ ret = 0;
}
- else
- ret = -ESRCH;
}
break;
int num = op->u.getpageframeinfo2.num;
domid_t dom = op->u.getpageframeinfo2.domain;
unsigned long *s_ptr = (unsigned long*) op->u.getpageframeinfo2.array;
- struct domain *p;
+ struct domain *d;
unsigned long l_arr[GPF2_BATCH];
ret = -ESRCH;
- if ( unlikely((p = find_domain_by_id(dom)) == NULL) )
+ if ( unlikely((d = find_domain_by_id(dom)) == NULL) )
break;
- if ( unlikely(num>1024) )
+ if ( unlikely(num > 1024) )
{
ret = -E2BIG;
break;
}
- ret = 0;
- for(n=0;n<num;)
+ ret = 0;
+ for( n = 0; n < num; )
{
int k = ((num-n)>GPF2_BATCH)?GPF2_BATCH:(num-n);
- if( copy_from_user( l_arr, &s_ptr[n], k*sizeof(unsigned long) ) )
+ if ( copy_from_user(l_arr, &s_ptr[n], k*sizeof(unsigned long)) )
{
ret = -EINVAL;
break;
}
- for(j=0;j<k;j++)
+ for( j = 0; j < k; j++ )
{
struct pfn_info *page;
unsigned long mfn = l_arr[j];
page = &frame_table[mfn];
- if ( likely(get_page(page, p)) )
+ if ( likely(get_page(page, d)) )
{
unsigned long type = 0;
switch( page->type_and_flags & PGT_type_mask )
}
- if( copy_to_user( &s_ptr[n], l_arr, k*sizeof(unsigned long) ) )
+ if ( copy_to_user(&s_ptr[n], l_arr, k*sizeof(unsigned long)) )
{
ret = -EINVAL;
break;
}
- n+=j;
+ n += j;
}
- put_domain(p);
-
+ put_domain(d);
}
break;